NO.25 K个一组翻转链表 困难
思路一:迭代实现 和徒手挖地球九周目中NO.24两两交换链表中的节点的迭代法思路一样,不过NO.24题中的k是2而已。
- 哑节点dummy。pre指向待翻转子链表的前驱,end指向待翻转子链表的尾节点。然后,start指向待翻转子链表的头节点,next指向待翻转子链表的后继。最后断开待翻转子链表和剩余链表,翻转第一组。
- 反转完成之后,将start节点和next节点连接。移动pre指向start节点,end指向pre节点,检查end.next不为空,所以向后移动end到下一组待翻转子链表的尾节点,start指向待翻转子链表的头节点,next指向待翻转子链表的后继。翻转第二组。
- 第二组翻转完成,将start节点和next节点连接。移动pre指向start节点,end指向pre节点,检查end.next不为空,所以向后移动end,但是剩余节点不足k个。所以翻转全部,返回dummy.next。
这里还有一个问题就是如何翻转子链表reverse(head)?用上述第一组子链表为例:
curr指向当前节点,pre指向curr之前节点,next指向curr之后节点,翻转过程比较简单,直接看图。
1 | public ListNode reverseKGroup(ListNode head, int k) { |
时间复杂度:O(nk) n是节点总数。
本人菜鸟,有错误请告知,感激不尽!